import cv2
import numpy as np
import os
import sys
# 此函数采集人脸信息放在./face_project/train/user文件夹

def get_imgs(user, picNum):
    '''

    :param user:  采集照片标签
    :param picNum:  照片数量
    :return:
    '''
    try:
        BASE_DIR = os.path.dirname(__file__)  # 获取当前文件夹的绝对路径

        cv2.namedWindow("Capture_Test")
        cap = cv2.VideoCapture(0)  # 创建一个 VideoCapture 对象


        cap.set(3, 680)
        cap.set(4, 550)
        classfier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
        color = (0, 255, 0)

        """
        函数名：cv2.isOpened()
        功  能：返回一个布尔值（ True / False ），检查是否初始化成功，成功返回 True
        返回值：布尔值
        """
        path = BASE_DIR+r'/face_project/train/'+user+'/'  # 采集人脸存放路径
        os.mkdir(path)  # 创建文件夹
        count = 0
        while (cap.isOpened()):  # 循环读取每一帧

            ret_flag, Vshow = cap.read()
            divisor = 8
            h, w = np.shape(Vshow)[:2]  # 整个图像的 行 列
            minSize = (w //divisor, h //divisor)
            if ret_flag:
                # 人脸检测
                gray = cv2.cvtColor(Vshow, cv2.COLOR_BGR2GRAY)      # 彩色转灰度
                faceRects = classfier.detectMultiScale(gray, 1.2, 2, cv2.CASCADE_SCALE_IMAGE, minSize)  # 人脸检测

                if len(faceRects) > 0:  # 检测到了人脸继续识别
                    for faceRect in faceRects:  # 可能多个人脸
                        x, y, w, h = faceRect
                        cv2.rectangle(Vshow, (x, y), (x + w, y + h), color, 3)
                        face = np.zeros((h, w), dtype='uint8')  # 初始化一个人脸空矩阵
                        for ii in range(x, x + w):
                            for jj in range(y, y + h):
                                face[jj - y, ii - x] = gray[jj, ii]  # 抠下检测出的人脸
                        count = count+1
                        _path = path + str(count)+'.jpg'
                        cv2.imencode('.jpg', face)[1].tofile(_path)




            cv2.imshow("Capture_Test", Vshow)
            if count >= picNum:  # 图片数量控制
                break

            k = cv2.waitKey(200) & 0xFF  # 每帧数据延时 1ms，延时不能为 0，否则读取的结果会是静态帧
            if k == ord('s'):  # 若检测到按键 ‘s’，打印字符串
                """
                函数名：cap.get( propId )
                功  能：查询视频的参数
                返回值：无
                参数一：查询的视频参数，其中部分值可以使用 cap.set() 进行修改
                """
                print(cap.get(3))
                print(cap.get(4))

            elif k == ord('q'):  # 若检测到按键 ‘q’，退出
                break

        cap.release()  # 释放摄像头
        cv2.destroyAllWindows()  # 删除建立的全部窗口
    except :
        print("Unexpected error:", sys.exc_info())   # sys.exc_info()返回出错信息




if __name__ == '__main__':

    #get_imgs('WuYanzu', 20)  # 标签已经存在会报错  删掉该文件夹再采集即可
    print("采集完成")